package com.android.wellcherish.workclock.database;

import android.arch.persistence.db.SupportSQLiteDatabase;
import android.arch.persistence.room.Database;
import android.arch.persistence.room.Room;
import android.arch.persistence.room.RoomDatabase;
import android.arch.persistence.room.migration.Migration;
import android.content.Context;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Message;
import android.support.annotation.NonNull;
import com.android.wellcherish.workclock.bean.db.Record;
import com.android.wellcherish.workclock.bean.db.RecordConstant;
import com.android.wellcherish.workclock.dao.RecordDao;

/**
 * @author 张文琛
 * @date 2019/11/1 21:53
 *
 * 代表数据库的类，可包含多张表，最好使用单例模式
 *
 * 在主module的build.gradle里面配置了参数，记录了数据库的版本变化，以json存储
 */
// 指定数据库中包含的表和数据库版本
@Database(entities = {Record.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
    private static volatile AppDatabase singleton;
    /**
     * 创建 Dao 的抽象类，有多少个 Entity 就创建多少个 Dao
     * */
    public abstract RecordDao recordDao();

    // 可以使用枚举实现单例模式，但是我不知道在单例下如何获取 Context。Orz
    // 暂时采用双重锁的方案实现单例
    private AppDatabase(){}

    public static AppDatabase getInstance(Context context) {
        if(singleton == null) {
            synchronized (AppDatabase.class) {
                if(singleton == null) {
                    singleton = Room.databaseBuilder(
                        context.getApplicationContext(),
                        AppDatabase.class,
                        RecordConstant.DATABASE_NAME)
                        // 数据库有变动时，使用这个方法
                        //.addMigrations(MIGRATION_1_2)
                        .build();
                }
            }
        }
        return singleton;
    }

    /**
     * 定义用于数据库升级和迁移的对象，版本从1升到2
     * 版本从2升到3，就定义MIGRATION_2_3，依次类推
     */
    public static final Migration MIGRATION_1_2 = new Migration(1, 2) {
        @Override public void migrate(@NonNull SupportSQLiteDatabase database) {
            // 实现数据库变动代码
            //database.execSQL("ALTER TABLE record " +
            // "ADD COLUMN date INTEGER NOT NULL DEFAULT 0");
        }
    };
}
